import axios from "axios";
import { message } from "antd";
// 引入 store
import store from "@/store";

// 创建一个 axios 实例
const request = axios.create({
  // TODO: 这里需要做调整，不能写死
  //    根据 process.env.NODE_ENV 的不同做不同的 baseURL
  // baseURL:
  //   process.env.NODE_ENV === "development"
  //     ? "http://localhost:3001"
  //     : "http://生产地址",
  //    根据 process.env.REACT_APP_BASEURL 来配置
  // baseURL: process.env.REACT_APP_BASEURL,
  baseURL: "http://localhost:3001",
  timeout: 1000 * 10, // 毫秒
  // headers: {
  //   // ? 在这儿直接配置请求头中的token可以嘛？
  //   // ！不行，token默认是没有的，需要登录之后才能获取到，这样的话，后续的接口不会带上token
  //   token: "xxxx",
  // },
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 获取到token
    //    1. 不要使用 useSelector (hook的规则)
    //    2. 直接通过 localStorage 获取  √
    //    3. 直接通过 store.getState() 获取仓库的数据  √
    const {
      user: { token },
    } = store.getState();
    if (token) {
      // 有些项目后端要的key不叫token,而是 Authorization
      // 有些项目后端要的token的值，需要加一个前缀  "Bearer "+ token
      config.headers.token = token;
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  // http 2xx 状态码进入
  (response) => {
    const { data } = response;

    // 判断业务状态码 code 是否等于 "200"
    // if (data.code !== "200") {
    //   // 直接报错
    //   message.error(data.message || "请求异常，请重试");
    //   // 抛出异常
    //   throw new Error(data.message);
    // }

    switch (data.code) {
      case "200":
        // OK
        return data;

      case "10119":
        // token 无效
        message.error("登录过期，请重新登录");
        window.location.href = "/login";
        break;

      default:
        // 直接报错
        message.error(data.message || "请求异常，请重试");
        // 抛出异常
        throw new Error(data.message);
    }
  },
  // 除了 2xx 之外的状态码进入
  //    401 没有权限
  //    403 访问受限
  //    404 Not found
  (error) => {
    return Promise.reject(error);
  }
);

export default request;
